"""
多个Admin站点配置
这里定义了不同的admin站点，用于演示如何创建多个独立的管理后台
支持两种实现方式：
1. 直接继承AdminSite（当前使用）
2. 使用AdminConfig配置（推荐用于应用级别的配置）
"""
from django.contrib import admin
from django.contrib.admin import AdminSite
from django.contrib.admin.apps import AdminConfig
from django.urls import path
from django.shortcuts import render
from django.http import HttpResponse
from django.template.response import TemplateResponse
from django.utils.safestring import mark_safe


class SuperAdminSite(AdminSite):
    """超级管理员站点 - 拥有所有权限"""
    site_header = '超级管理员后台'
    site_title = '超级管理员'
    index_title = '欢迎使用超级管理员后台'
    site_url = None  # 不显示"查看站点"链接
    login_template = 'admin/super_admin/login.html'  # 自定义登录模板

    def index(self, request, extra_context=None):
        """自定义首页"""
        extra_context = extra_context or {}

        # 添加统计数据
        from core.models import CustomUser
        from products.models import Product, Category, Brand
        from orders.models import Order

        stats = {
            'total_users': CustomUser.objects.count(),
            'total_products': Product.objects.count(),
            'total_categories': Category.objects.count(),
            'total_brands': Brand.objects.count(),
            'total_orders': Order.objects.count(),
            'active_products': Product.objects.filter(status='active').count(),
            'vip_users': CustomUser.objects.filter(is_vip=True).count(),
            'pending_orders': Order.objects.filter(status='pending').count(),
        }

        extra_context['statistics'] = stats

        # 直接返回TemplateResponse
        context = self.each_context(request)
        context.update(extra_context)
        context['app_list'] = self.get_app_list(request)

        return TemplateResponse(
            request,
            'admin/super_admin/index.html',
            context
        )

    def get_urls(self):
        """添加自定义URL"""
        urls = super().get_urls()
        custom_urls = [
            path('reports/', self.admin_view(self.reports_view), name='reports'),
            path('analytics/', self.admin_view(self.analytics_view), name='analytics'),
        ]
        return custom_urls + urls

    def reports_view(self, request):
        """报表页面"""
        context = {
            'title': '数据报表',
            'opts': {},
            'has_permission': True,
        }
        return TemplateResponse(request, 'admin/reports.html', context)

    def analytics_view(self, request):
        """分析页面"""
        context = {
            'title': '数据分析',
            'opts': {},
            'has_permission': True,
        }
        return TemplateResponse(request, 'admin/analytics.html', context)


class ProductAdminSite(AdminSite):
    """产品管理员站点 - 只管理产品相关"""
    site_header = '产品管理后台'
    site_title = '产品管理'
    index_title = '产品管理中心'
    site_url = None
    login_template = 'admin/product_admin/login.html'  # 自定义登录模板

    def has_permission(self, request):
        """自定义权限检查"""
        return request.user.is_active and (
            request.user.is_staff or
            request.user.groups.filter(name='产品管理员').exists()
        )


class OrderAdminSite(AdminSite):
    """订单管理员站点 - 只管理订单相关"""
    site_header = '订单管理后台'
    site_title = '订单管理'
    index_title = '订单管理中心'
    site_url = None
    login_template = 'admin/order_admin/login.html'  # 自定义登录模板

    def has_permission(self, request):
        """自定义权限检查"""
        return request.user.is_active and (
            request.user.is_staff or
            request.user.groups.filter(name='订单管理员').exists()
        )


class UserAdminSite(AdminSite):
    """用户管理员站点 - 只管理用户相关"""
    site_header = '用户管理后台'
    site_title = '用户管理'
    index_title = '用户管理中心'
    site_url = None
    login_template = 'admin/user_admin/login.html'  # 自定义登录模板

    def has_permission(self, request):
        """自定义权限检查"""
        return request.user.is_active and (
            request.user.is_staff or
            request.user.groups.filter(name='用户管理员').exists()
        )


# 创建站点实例
super_admin_site = SuperAdminSite(name='super_admin')
product_admin_site = ProductAdminSite(name='product_admin')
order_admin_site = OrderAdminSite(name='order_admin')
user_admin_site = UserAdminSite(name='user_admin')


# 注册模型到不同的站点
def register_models():
    """将模型注册到不同的admin站点"""
    from core.models import CustomUser
    from products.models import Category, Brand, Product, ProductImage
    from orders.models import Order, OrderItem, OrderStatusHistory
    from core.admin import CustomUserAdmin
    from products.admin import CategoryAdmin, BrandAdmin, ProductAdmin, ProductImageAdmin
    from orders.admin import OrderAdmin, OrderItemAdmin, OrderStatusHistoryAdmin

    # 超级管理员站点 - 注册所有模型
    super_admin_site.register(CustomUser, CustomUserAdmin)
    super_admin_site.register(Category, CategoryAdmin)
    super_admin_site.register(Brand, BrandAdmin)
    super_admin_site.register(Product, ProductAdmin)
    super_admin_site.register(ProductImage, ProductImageAdmin)
    super_admin_site.register(Order, OrderAdmin)
    super_admin_site.register(OrderItem, OrderItemAdmin)
    super_admin_site.register(OrderStatusHistory, OrderStatusHistoryAdmin)

    # 产品管理员站点 - 只注册产品相关模型
    product_admin_site.register(Category, CategoryAdmin)
    product_admin_site.register(Brand, BrandAdmin)
    product_admin_site.register(Product, ProductAdmin)
    product_admin_site.register(ProductImage, ProductImageAdmin)

    # 订单管理员站点 - 只注册订单相关模型
    order_admin_site.register(Order, OrderAdmin)
    order_admin_site.register(OrderItem, OrderItemAdmin)
    order_admin_site.register(OrderStatusHistory, OrderStatusHistoryAdmin)

    # 用户管理员站点 - 只注册用户相关模型
    user_admin_site.register(CustomUser, CustomUserAdmin)


# 调用注册函数
register_models()


# =============================================================================
# 使用AdminConfig的替代实现方式（推荐用于应用级别的配置）
# =============================================================================

class CustomAdminConfig(AdminConfig):
    """
    自定义Admin配置类
    用于应用级别的Admin配置，更加符合Django的最佳实践
    """
    default_site = 'admin_learn_project.admin_sites.CustomAdminSite'
    verbose_name = '自定义管理后台'


class CustomAdminSite(AdminSite):
    """
    通过AdminConfig配置的自定义Admin站点
    这种方式更适合在settings.py中配置
    """
    site_header = '企业级管理后台'
    site_title = '企业管理'
    index_title = '欢迎使用企业级管理系统'
    site_url = '/'
    login_template = 'admin/login.html'

    def __init__(self, name='admin'):
        super().__init__(name)
        # 自动注册所有模型
        self.auto_register_models()

    def auto_register_models(self):
        """自动注册所有应用中的模型"""
        from django.apps import apps
        from django.contrib.auth.models import Group, User

        # 获取所有应用的模型
        for app_config in apps.get_app_configs():
            if app_config.name in ['core', 'products', 'orders']:  # 只注册指定应用
                for model in app_config.get_models():
                    try:
                        # 尝试从默认admin站点获取已注册的ModelAdmin
                        model_admin = admin.site._registry.get(model)
                        if model_admin:
                            # 使用相同的ModelAdmin类
                            self.register(model, model_admin.__class__)
                        else:
                            # 使用默认的ModelAdmin
                            self.register(model)
                    except admin.sites.AlreadyRegistered:
                        # 模型已经注册，跳过
                        pass

    def each_context(self, request):
        """添加额外的上下文变量"""
        context = super().each_context(request)
        context.update({
            'custom_message': '这是通过AdminConfig配置的管理后台',
            'company_name': 'Django学习项目',
            'version': '1.0.0',
        })
        return context


# 创建通过AdminConfig配置的站点实例
custom_admin_site = CustomAdminSite(name='custom_admin')


# =============================================================================
# 增强型AdminSite - 用于AdminConfig的default_site
# =============================================================================

class EnhancedAdminSite(AdminSite):
    """
    增强型Admin站点 - 通过AdminConfig配置使用
    结合了多站点管理的优势和AdminConfig的规范性
    """
    site_header = 'Django Admin学习项目 - 增强版'
    site_title = 'Admin学习增强版'
    index_title = '欢迎使用Django Admin学习项目增强版'
    site_url = '/'
    login_template = 'admin/login.html'

    def __init__(self, name='admin'):
        super().__init__(name)
        # 自动注册所有模型
        self._auto_register_models()

    def _auto_register_models(self):
        """
        自动注册所有应用中的模型
        这是AdminConfig方式的一个优势
        """
        from django.apps import apps
        from django.contrib.auth.models import Group, User

        # 获取所有应用的模型
        for app_config in apps.get_app_configs():
            if app_config.name in ['core', 'products', 'orders']:  # 只注册指定应用
                for model in app_config.get_models():
                    try:
                        # 尝试从默认admin站点获取已注册的ModelAdmin
                        from django.contrib import admin
                        model_admin = admin.site._registry.get(model)
                        if model_admin:
                            # 使用相同的ModelAdmin类
                            self.register(model, model_admin.__class__)
                        else:
                            # 使用默认的ModelAdmin
                            self.register(model)
                    except admin.sites.AlreadyRegistered:
                        # 模型已经注册，跳过
                        pass

    def each_context(self, request):
        """
        添加额外的上下文变量
        """
        context = super().each_context(request)
        context.update({
            'custom_message': '这是通过AdminConfig配置的增强版管理后台',
            'project_name': 'Django学习项目',
            'version': '2.0.0',
            'admin_mode': 'Enhanced',
        })
        return context

    def index(self, request, extra_context=None):
        """
        自定义首页，显示统计信息
        """
        extra_context = extra_context or {}

        # 添加统计数据
        try:
            from core.models import CustomUser
            from products.models import Product, Category, Brand
            from orders.models import Order

            stats = {
                'total_users': CustomUser.objects.count(),
                'total_products': Product.objects.count(),
                'total_categories': Category.objects.count(),
                'total_brands': Brand.objects.count(),
                'total_orders': Order.objects.count(),
                'active_products': Product.objects.filter(status='active').count(),
                'vip_users': CustomUser.objects.filter(is_vip=True).count(),
                'pending_orders': Order.objects.filter(status='pending').count(),
            }
            extra_context['statistics'] = stats
        except Exception as e:
            # 如果模型还没有迁移，忽略错误
            extra_context['statistics'] = None

        return super().index(request, extra_context)


# 创建增强型admin站点实例
enhanced_admin_site = EnhancedAdminSite(name='enhanced_admin')


# =============================================================================
# 两种方式的比较和选择指导
# =============================================================================

"""
使用AdminConfig vs 直接继承AdminSite：

1. 直接继承AdminSite（当前使用）：
   优点：
   - 简单直接，易于理解
   - 完全控制每个站点的配置
   - 适合创建多个不同功能的管理后台
   - 每个站点可以有独立的URL和权限

   缺点：
   - 需要手动注册模型
   - 不符合Django的应用配置最佳实践

2. 使用AdminConfig（推荐）：
   优点：
   - 符合Django的应用配置模式
   - 在settings.py中统一配置
   - 可以自动注册模型
   - 更加模块化和可维护

   缺点：
   - 相对复杂一些
   - 不适合创建多个独立的管理后台

选择建议：
- 如果您需要多个不同的管理后台（如当前项目），使用直接继承AdminSite
- 如果只是要自定义默认的admin配置，使用AdminConfig
- 对于企业级应用，推荐使用AdminConfig
"""


# =============================================================================
# 在settings.py中使用AdminConfig的配置示例
# =============================================================================

"""
# 在settings.py中更换默认的admin配置：

INSTALLED_APPS = [
    'admin_learn_project.admin_sites.CustomAdminConfig',  # 使用自定义AdminConfig
    # 'django.contrib.admin',  # 注释掉默认的admin
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core',
    'products',
    'orders',
]

# 可选：自定义admin站点设置
ADMIN_SITE_HEADER = '企业级管理后台'
ADMIN_SITE_TITLE = '企业管理'
ADMIN_INDEX_TITLE = '欢迎使用企业级管理系统'
"""
